package com.jt.consumer.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * 定义服务消费断controller，在这个controller对象的方法
 * 中实现对远端服务sca-provider的调用
 */
@RestController
public class ConsumerController {
    /**
     * 从spring容器中获取一个RestTemplate对象
     * 基于此对象实现远端服务调用
     */
    @Resource
    private RestTemplate restTemplate;

    /**
     * 借助此对象，可以基于服务名从nacos获取多个服务实例
     * 并且于一定的额负载均衡算法进行远端服务调用
     */
    @Resource
    private LoadBalancerClient loadBalancerClient;
    @Value("${spring.application.name}")
    String appName;
    /**
     * 在此方法中通过一个RestTemplate对象调用远端sca-provider中的服务
     * @return
     * 访问此方法的url: http://localhost:8090/consumer/doRestEcho1
     */
    @GetMapping("/consumer/doRestEcho1")
    public String doRestEcho1(){
//        String url = "http://localhost:8081/provider/echo/8090";
//        String url = "http://localhost:8082/provider/echo/8090";
        //基于服务名获取服务实例
        ServiceInstance serviceInstance = loadBalancerClient.choose("sca-provider");
        //基于服务实例构建要访问的服务的url
        String ip = serviceInstance.getHost();
        int port = serviceInstance.getPort();
        //String url = "http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/provider/echo/8090";
        String url = String.format("http://%s:%s/provider/echo/{msg}",ip,port);
        return restTemplate.getForObject(url, //远端服务器的url
                                        String.class,appName);//远端服务url对应的返回值类型

    }

    @Resource
    private RestTemplate locaBalanceRestTemplate;
    @GetMapping("/consumer/doRestEcho2")
    public String doRestEcho2(){
        String url = String.format("http://%s/provider/echo/{msg}","sca-provider");
        //向服务提供方发起http请求，获取响应数据
        return locaBalanceRestTemplate.getForObject(url, //远端服务器的url
                String.class,appName);//远端服务url对应的返回值类型

    }
}
